package jdbc;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 数据库操作层
 *
 * @author Chova
 * @date 2022/05/31
 */
public class JdbcDao {

    // 新增操作
    public void addGoddess(JdbcEntity entity) throws SQLException {
        Connection con=DBUtil.getConnection();
        // SQL中的参数用 ? 表示,相当于占位符,然后对参数进行赋值
        String sql = "" +
                "insert into user"+
                "(user_name,sex,age,birthday,email,mobile,"+
                "create_user,create_date,update_user,update_date,isdel) "+
                "values("+
                "?,?,?,?,?,?,?,current_date(),?,current_date(),?)";
        /*
         * 预编译SQL语句
         * prepareStatement这个方法会将SQL语句加载到驱动程序conn集成程序中,但是并不直接执行
         * 当调用execute()方法的时候才真正执行
         */
        PreparedStatement psmt = con.prepareStatement(sql);
        // SQL传递参数值
        psmt.setString(1, entity.getUserName());
        psmt.setInt(2, entity.getSex());
        psmt.setInt(3, entity.getAge());
        //注意：setDate()函数第二个参数需要的是java.sql.Date类型，我们传进来的是java.util.Date，类型不符，需要做一下转换
        psmt.setDate(4, new Date(entity.getBirthday().getTime()));
        psmt.setString(5, entity.getEmail());
        psmt.setString(6, entity.getMobile());
        psmt.setString(7, entity.getCreateUser());
        psmt.setString(8, entity.getUpdateUser());
        psmt.setInt(9, entity.getIsDel());
        /*
         * 执行SQL语句
         * 参数会加载在SQL语句中,把SQL语句拼接完整才去执行,这样可以减少对数据库的操作
         */
        psmt.execute();
    }

    // 更新操作
    public void updateGoddess(JdbcEntity entity) throws SQLException {
        Connection conn = DBUtil.getConnection();
        /*
         * 参数用 ? 表示,相当于占位符
         * 用mysql的日期函数current_date()来获取当前日期
         */
        String sql="" +
            "update user "+
            "set user_name=?,sex=?,age=?,birthday=?,email=?,mobile=?,"+
            "update_user=?,update_date=current_date(),isdel=?) "+
            "where id=?";
        // 预编译sql语句
        PreparedStatement psmt = conn.prepareStatement(sql);
        // 给SQL语句传递参数
        psmt.setString(1, entity.getUserName());
        psmt.setInt(2, entity.getSex());
        psmt.setInt(3, entity.getAge());
        // setDate()函数第二个参数需要的是java.sql.Date类型,传进来的是java.util.Date,类型不符,需要做一下转换
        psmt.setDate(4, new Date(entity.getBirthday().getTime()));
        psmt.setString(5, entity.getEmail());
        psmt.setString(6, entity.getMobile());
        psmt.setString(7, entity.getUpdateUser());
        psmt.setInt(8, entity.getIsDel());
        psmt.setInt(9, entity.getId());
        // 执行SQL语句
        psmt.execute();

        // 6. 关闭数据库连接
        psmt.close();
        conn.close();
    }

    // 删除操作
    public void delGoddess(Integer id) throws SQLException {
        Connection conn = DBUtil.getConnection();
        /*
         * 参数用 ? 表示,相当于占位符
         * 用mysql的日期函数current_date()来获取当前日期
         */
        String sql="" +
            "delete from user "+
            "where id=?";
        // 预编译sql语句
        PreparedStatement psmt = conn.prepareStatement(sql);
        // 给SQL语句传递参数
        psmt.setInt(1, id);
        // 执行SQL语句
        psmt.execute();

        // 6. 关闭数据库连接
        psmt.close();
        conn.close();
    }

    // 查询操作
    public List<JdbcEntity> query() throws Exception{
        List<JdbcEntity> entityList = new ArrayList<>();

        Connection conn = DBUtil.getConnection();
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("select user_name,age from user");
        // 输出查询结果
        while(rs.next()){
            JdbcEntity entity = new JdbcEntity();
            entity.setUserName(rs.getString("user_name"));
            entity.setAge(rs.getInt("age"));
            entityList.add(entity);
        }

        // 6. 关闭数据库连接
        rs.close();
        stmt.close();
        conn.close();

        return entityList;
    }

    // 查询单条数据
    public JdbcEntity get(Integer id) throws SQLException {
        JdbcEntity entity = null;
        Connection conn = DBUtil.getConnection();
        // 参数用 ? 表示,相当于占位符
        String sql="" +
            "select * from user "+
            "where id=?";
        // 预编译sql语句
        PreparedStatement psmt = conn.prepareStatement(sql);
        // 先对应SQL语句，给SQL语句传递参数
        psmt.setInt(1, id);
        /*
         * 执行SQL语句
         * psmt.execute()方法是执行更改数据库操作.包括新增,修改,删除
         * psmt.executeQuery()是执行查询操作
         */
        ResultSet rs = psmt.executeQuery();
        // 遍历返回的一个结果集
        while(rs.next()){
            entity = new JdbcEntity();
            entity.setId(rs.getInt("id"));
            entity.setUserName(rs.getString("user_name"));
            entity.setAge(rs.getInt("age"));
            entity.setSex(rs.getInt("sex"));
            // rs.getDate("birthday")获得的是java.sql.Date类型.这里java.sql.Date类型是java.util.Date类型的子集,所以不需要进行转换
            entity.setBirthday(rs.getDate("birthday"));
            entity.setEmail(rs.getString("email"));
            entity.setMobile(rs.getString("mobile"));
            entity.setCreateUser(rs.getString("create_user"));
            entity.setCreateDate(rs.getDate("create_date"));
            entity.setUpdateUser(rs.getString("update_user"));
            entity.setUpdateDate(rs.getDate("update_date"));
            entity.setIsDel(rs.getInt("isdel"));
        }

        // 6. 关闭数据库连接
        rs.close();
        psmt.close();
        conn.close();

       return entity;
    }

    public List<JdbcEntity> listCondition(String name,String mobile) throws SQLException {
        List<JdbcEntity > entityList = new ArrayList<>();

        Connection conn = DBUtil.getConnection();
        StringBuffer sb = new StringBuffer();
        sb.append("select * from user ");
        sb.append("where user_name like ? and mobile like ?");
        // 预编译sql语句
        PreparedStatement psmt = conn.prepareStatement(sb.toString());
        // 给SQL语句传递参数
        psmt.setString(1, "%"+name+"%");
        psmt.setString(2, "%"+mobile+"%");
        System.out.println(sb);
        /*
         * 执行SQL语句
         * psmt.execute()方法是执行更改数据库操作.包括新增,修改,删除
         * psmt.executeQuery()是执行查询操作
         */
        ResultSet rs = psmt.executeQuery();
        // 遍历返回的结果集
        while(rs.next()){
            JdbcEntity entity = new JdbcEntity();
            entity.setId(rs.getInt("id"));
            entity.setUserName(rs.getString("user_name"));
            entity.setAge(rs.getInt("age"));
            entity.setSex(rs.getInt("sex"));
            // rs.getDate("birthday")获得的是java.sql.Date类型.这里java.sql.Date类型是java.util.Date类型的子集,所以不需要进行转换
            entity.setBirthday(rs.getDate("birthday"));
            entity.setEmail(rs.getString("email"));
            entity.setMobile(rs.getString("mobile"));
            entity.setCreateUser(rs.getString("create_user"));
            entity.setCreateDate(rs.getDate("create_date"));
            entity.setUpdateUser(rs.getString("update_user"));
            entity.setUpdateDate(rs.getDate("update_date"));
            entity.setIsDel(rs.getInt("isdel"));
            // 将结果添加到对象中
            entityList.add(entity);
        }

        // 6. 关闭数据库连接
        rs.close();
        psmt.close();
        conn.close();

        return entityList;
    }
}
